/*
* @Author: chenggh
* @Date: 2025-06-13
* @Link to Problem : https://oj.haizeix.com/problem/44
*/

// 扩展，输出最优方案
// 想要最优方案，一定是在决策的时候进行记录

#include <iostream>
#include <limits>
#include <stdint.h>
#include <inttypes.h>
using namespace std;
int a[1000005] = {0};
int dp[1000005] = {0};
// pre[i] == j : i位置的val 接在j位置val后面
int pre[1000005] = {0};
int main(){
	int n; cin >> n;
	a[0] = INT32_MIN;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	int ans = 0, ind = 0;
	for(int i = 1; i <= n; i++){
		for(int j = 0; j < i; j++){
			if(a[j] >= a[i]) continue;
			if(dp[j] + 1 > dp[i]){
				dp[i] = dp[j] + 1;
				// 以i结尾的最长上升子序列, 他的前一位是j
				pre[i] = j;
			}
		}
		if(dp[i] > ans){
			ans = dp[i];
			// 记录最长上升子序列的结尾是谁
			ind = i;
		}
	}
	// ind: 当前最长序列结尾位置
	// 前一个: pre[ind]位置就是ind位置的子序列前一个值的位置
	cout << ans << endl;
	while(ind){
		printf("%d(%d) -> ", ind, a[ind]);
		ind = pre[ind]; // 类似于递归求解
	}
	cout << endl;
	return 0;
}